home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Ebooks / Thinking in C++ V2 / C14 / FName2.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-25  |  1.1 KB  |  44 lines

  1. //: C14:FName2.cpp
  2. // From Thinking in C++, 2nd Edition
  3. // Available at http://www.BruceEckel.com
  4. // (c) Bruce Eckel 1999
  5. // Copyright notice in Copyright.txt
  6. // Subtyping solves the problem
  7. #include "../require.h"
  8. #include <iostream>
  9. #include <fstream>
  10. #include <strstream>
  11. using namespace std;
  12.  
  13. class FName2 : public ifstream {
  14.   static const int bsize = 100;
  15.   char buf[bsize];
  16.   ostrstream fname;
  17.   int nameset;
  18. public:
  19.   FName2() : fname(buf, bsize), nameset(0) {}
  20.   FName2(const char* filename)
  21.     : ifstream(filename), fname(buf, bsize) {
  22.       assure(*this, filename);
  23.       fname << filename << ends;
  24.       nameset = 1;
  25.   }
  26.   const char* name() const { return buf; }
  27.   void name(const char* newname) {
  28.     if(nameset) return; // Don't overwrite
  29.     fname << newname << ends;
  30.     nameset = 1;
  31.   }
  32. };
  33.  
  34. int main() {
  35.   FName2 file("FName2.cpp");
  36.   assure(file, "FName2.cpp");
  37.   cout << "name: " << file.name() << endl;
  38.   const int bsize = 100;
  39.   char buf[bsize];
  40.   file.getline(buf, bsize); // This works too!
  41.   file.seekg(-200, ios::end);
  42.   cout << file.rdbuf() << endl;
  43. } ///:~
  44.